package com.example.login

import BiometricAuthManager
import android.content.Intent
import android.util.Log
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.biometric.BiometricPrompt
import com.baway.common.view.BaseMvvmActivity
import com.example.lib_base.path.RouterPath
import com.example.login.databinding.ActivityLoginBinding
import com.example.main.MainActivity

class LoginActivity : BaseMvvmActivity<ActivityLoginBinding>() {

    private lateinit var biometricAuthManager: BiometricAuthManager
    private val TAG = "LoginActivity"

    override fun initViews() {
        super.initViews()
        biometricAuthManager = BiometricAuthManager(this)

        Log.d(TAG, "=== 开始生物识别状态检查 ===")

        // 检查生物识别状态
        checkDetailedBiometricStatus()

        // 设置认证按钮
        mDataBinding.authButton.setOnClickListener {
            startBiometricAuth()
        }
    }

    private fun checkDetailedBiometricStatus() {
        Log.d(TAG, "开始详细生物识别状态检查...")

        val status = biometricAuthManager.getBiometricStatus()
        Log.d(TAG, "生物识别状态结果: $status")

        // 状态0 = BiometricManager.BIOMETRIC_SUCCESS = 可用
        when (status) {
            BiometricStatus.AVAILABLE -> {
                Log.d(TAG, "✅ 生物识别功能可用")
                showToast("生物识别功能可用")

                // 额外检查真实可用性
                if (biometricAuthManager.isBiometricReallyAvailable()) {
                    Log.d(TAG, "✅ 生物识别已准备好使用")
                    showToast("点击按钮开始生物识别")
                } else {
                    Log.w(TAG, "❌ 生物识别初始化失败")
                    showToast("生物识别初始化失败")
                }
            }
            BiometricStatus.NOT_ENROLLED -> {
                Log.w(TAG, "❌ 设备未注册生物识别信息")
                showToast("设备未注册生物识别信息")
                showBiometricEnrollmentDialog()
            }
            BiometricStatus.NO_HARDWARE -> {
                Log.w(TAG, "❌ 设备没有生物识别硬件")
                showToast("设备没有生物识别硬件")
            }
            BiometricStatus.HARDWARE_UNAVAILABLE -> {
                Log.w(TAG, "❌ 生物识别硬件暂时不可用")
                showToast("生物识别硬件暂时不可用")
            }
            BiometricStatus.SECURITY_UPDATE_REQUIRED -> {
                Log.w(TAG, "❌ 需要安全更新")
                showToast("请更新系统安全补丁")
            }
            else -> {
                Log.w(TAG, "❌ 生物识别状态未知或不可用: $status")
                showToast("生物识别状态未知")
            }
        }

        Log.d(TAG, "=== 生物识别状态检查完成 ===")
    }

    private fun startBiometricAuth() {
        Log.d(TAG, "=== 开始生物识别认证流程 ===")

        // 先检查是否真的可用
        if (!biometricAuthManager.isBiometricReallyAvailable()) {
            showToast("生物识别当前不可用，请检查状态")
            checkDetailedBiometricStatus()
            return
        }

        Log.d(TAG, "初始化生物识别认证...")
        val initSuccess = biometricAuthManager.initBiometricAuth(
            activity = this,
            onSuccess = { result ->
                runOnUiThread {
                    Log.d(TAG, "✅ 生物识别认证成功")
                    showToast("认证成功！")
                    onAuthSuccess()
                }
            },
            onError = { errorCode, errString ->
                runOnUiThread {
                    Log.e(TAG, "❌ 生物识别错误: $errorCode - $errString")
                    handleAuthError(errorCode, errString)
                }
            },
            onFailed = {
                runOnUiThread {
                    Log.w(TAG, "❌ 生物识别认证失败")
                    showToast("认证失败，请重试")
                }
            },
            onCancel = {
                runOnUiThread {
                    Log.d(TAG, "⏹️ 生物识别认证取消")
                    showToast("认证已取消")
                }
            }
        )

        if (initSuccess) {
            Log.d(TAG, "生物识别初始化成功，显示对话框...")
            val showSuccess = biometricAuthManager.showBiometricPrompt()
            if (showSuccess) {
                Log.d(TAG, "✅ 生物识别对话框显示成功")
            } else {
                Log.e(TAG, "❌ 显示生物识别对话框失败")
                showToast("无法显示生物识别对话框")
            }
        } else {
            Log.e(TAG, "❌ 生物识别初始化失败")
            showToast("生物识别初始化失败")
        }
    }

    private fun handleAuthError(errorCode: Int, errString: CharSequence) {
        Log.e(TAG, "生物识别错误代码: $errorCode, 信息: $errString")

        when (errorCode) {
            BiometricPrompt.ERROR_LOCKOUT -> {
                showToast("验证失败次数过多，请稍后重试")
            }
            BiometricPrompt.ERROR_LOCKOUT_PERMANENT -> {
                showToast("生物识别已被永久锁定，请使用其他验证方式")
            }
            BiometricPrompt.ERROR_NO_BIOMETRICS -> {
                showToast("未找到生物识别信息")
                showBiometricEnrollmentDialog()
            }
            BiometricPrompt.ERROR_HW_UNAVAILABLE -> {
                showToast("生物识别硬件不可用")
            }
            BiometricPrompt.ERROR_USER_CANCELED -> {
                // 用户取消，不显示提示
                Log.d(TAG, "用户取消生物识别")
            }
            else -> {
                showToast("认证错误: $errString")
                Log.e(TAG, "未知生物识别错误: $errorCode - $errString")
            }
        }
    }

    private fun showBiometricEnrollmentDialog() {
        AlertDialog.Builder(this)
            .setTitle("生物识别未注册")
            .setMessage("请在系统设置中注册指纹或面部信息以使用此功能")
            .setPositiveButton("去设置") { _, _ ->
                openBiometricSettings()
            }
            .setNegativeButton("取消", null)
            .show()
    }

    private fun openBiometricSettings() {
        try {
            val intent = Intent(android.provider.Settings.ACTION_BIOMETRIC_ENROLL)
            startActivity(intent)
        } catch (e: Exception) {
            Log.e(TAG, "打开生物识别设置失败: ${e.message}")
            showToast("无法打开设置页面")

            // 备用方案：打开安全设置
            try {
                val intent = Intent(android.provider.Settings.ACTION_SECURITY_SETTINGS)
                startActivity(intent)
            } catch (e2: Exception) {
                Log.e(TAG, "打开安全设置也失败: ${e2.message}")
            }
        }
    }

    private fun onAuthSuccess() {
        Log.d(TAG, "✅ 认证成功，跳转到主页面")
        val intent = Intent(this, MainActivity::class.java)
        startActivity(intent)
        finish()
    }

    private fun showToast(message: String) {
        try {
            Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
            Log.d(TAG, "Toast: $message")
        } catch (e: Exception) {
            Log.e(TAG, "显示Toast失败: ${e.message}")
        }
    }

    override fun onPause() {
        super.onPause()
        biometricAuthManager.cancelAuthentication()
    }

    override fun getLayoutID(): Int = R.layout.activity_login
}